const mysql = require('mysql2/promise');
const fs = require('fs').promises;
const path = require('path');
require('dotenv').config();

async function initDatabase() {
  let connection;
  
  try {
    console.log('🔄 开始初始化数据库...');
    
    // 创建数据库连接（不指定数据库）
    connection = await mysql.createConnection({
      host: process.env.DB_HOST || 'localhost',
      port: process.env.DB_PORT || 3306,
      user: process.env.DB_USER || 'root',
      password: process.env.DB_PASSWORD || '',
      charset: 'utf8mb4'
    });
    
    console.log('✅ 数据库连接成功');
    
    // 读取SQL文件
    const schemaPath = path.join(__dirname, '../database/schema.sql');
    const schemaSql = await fs.readFile(schemaPath, 'utf8');
    
    console.log('📖 读取数据库架构文件成功');
    
    // 首先创建数据库
    try {
      await connection.execute(`CREATE DATABASE IF NOT EXISTS ${process.env.DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci`);
      console.log('✅ 数据库创建成功');
    } catch (error) {
      if (error.code === 'ER_DB_CREATE_EXISTS') {
        console.log('⚠️  数据库已存在，跳过创建');
      } else {
        console.error('❌ 创建数据库失败:', error.message);
        throw error;
      }
    }

    // 关闭当前连接
    await connection.end();

    // 重新连接到指定数据库
    connection = await mysql.createConnection({
      host: process.env.DB_HOST || 'localhost',
      port: process.env.DB_PORT || 3306,
      user: process.env.DB_USER || 'root',
      password: process.env.DB_PASSWORD || '',
      database: process.env.DB_NAME,
      charset: 'utf8mb4'
    });

    console.log(`✅ 连接到数据库 ${process.env.DB_NAME}`);

    // 分割SQL语句（按分号分割，忽略注释和USE语句）
    const statements = schemaSql
      .split(';')
      .map(stmt => {
        // 移除注释行
        return stmt
          .split('\n')
          .filter(line => !line.trim().startsWith('--'))
          .join('\n')
          .trim();
      })
      .filter(stmt =>
        stmt.length > 0 &&
        !stmt.toUpperCase().startsWith('CREATE DATABASE') &&
        !stmt.toUpperCase().startsWith('USE ')
      );

    console.log(`📝 找到 ${statements.length} 条SQL语句`);

    // 执行每条SQL语句
    for (let i = 0; i < statements.length; i++) {
      const statement = statements[i];

      if (statement.trim()) {
        try {
          await connection.execute(statement);
          console.log(`✅ 执行语句 ${i + 1}/${statements.length} 成功`);
        } catch (error) {
          // 忽略一些可能的错误（如表已存在）
          if (error.code === 'ER_DB_CREATE_EXISTS' ||
              error.code === 'ER_TABLE_EXISTS_ERROR' ||
              error.code === 'ER_DUP_ENTRY') {
            console.log(`⚠️  语句 ${i + 1} 跳过: ${error.message}`);
          } else {
            console.error(`❌ 执行语句 ${i + 1} 失败:`, error.message);
            console.error('语句内容:', statement.substring(0, 100) + '...');
          }
        }
      }
    }
    
    console.log('🎉 数据库初始化完成！');
    console.log('');
    console.log('📋 创建的表:');
    console.log('  - users (用户表)');
    console.log('  - game_categories (游戏类型表)');
    console.log('  - appointments (预约表)');
    console.log('  - appointment_participants (预约参与者表)');
    console.log('  - applications (申请表)');
    console.log('  - user_sessions (用户会话表)');
    console.log('  - system_logs (系统日志表)');
    console.log('');
    console.log('👤 测试用户账号:');
    console.log('  - 用户名: admin, 密码: 123456');
    console.log('  - 用户名: user1, 密码: 123456');
    console.log('  - 用户名: user2, 密码: 123456');
    console.log('');
    console.log('🎮 预设游戏类型:');
    console.log('  - MOBA, FPS, RPG, RTS, MMO, 其他');
    
  } catch (error) {
    console.error('❌ 数据库初始化失败:', error);
    process.exit(1);
  } finally {
    if (connection) {
      await connection.end();
      console.log('🔌 数据库连接已关闭');
    }
  }
}

// 检查环境变量
function checkEnvironment() {
  const requiredVars = ['DB_HOST', 'DB_USER', 'DB_NAME'];
  const missing = requiredVars.filter(varName => !process.env[varName]);

  if (missing.length > 0) {
    console.error('❌ 缺少必要的环境变量:');
    missing.forEach(varName => {
      console.error(`  - ${varName}`);
    });
    console.error('');
    console.error('请创建 .env 文件并设置这些变量，参考 .env.example');
    process.exit(1);
  }

  // DB_PASSWORD 可以为空，但需要存在
  if (process.env.DB_PASSWORD === undefined) {
    console.error('❌ 缺少环境变量: DB_PASSWORD');
    console.error('   注意: 如果MySQL没有密码，请设置 DB_PASSWORD= (空值)');
    console.error('');
    console.error('请创建 .env 文件并设置这些变量，参考 .env.example');
    process.exit(1);
  }
}

// 主函数
async function main() {
  console.log('🎮 游戏预约系统 - 数据库初始化工具');
  console.log('='.repeat(50));
  
  // 检查环境变量
  checkEnvironment();
  
  // 初始化数据库
  await initDatabase();
  
  console.log('='.repeat(50));
  console.log('✨ 初始化完成！现在可以启动后端服务器了。');
  console.log('');
  console.log('启动命令:');
  console.log('  npm run dev    # 开发模式');
  console.log('  npm start      # 生产模式');
}

// 如果直接运行此脚本
if (require.main === module) {
  main().catch(error => {
    console.error('❌ 初始化过程中发生错误:', error);
    process.exit(1);
  });
}

module.exports = { initDatabase };
